from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute, Aer
from math import atan2, pi

# 初始化
simulator = Aer.get_backend('qasm_simulator') # 获取模拟器
qreg_q = None   # 量子寄存器
creg_c = None # 经典寄存器

# 待估计角度
studentID = 2019333331111 # 请在这里填入学号
import hashlib
IDCode = int(hashlib.sha1(str(studentID).encode('utf-8')).hexdigest(),16)
angle = IDCode % 1000 / 1000 * pi

# 电路1搭建
circuit1 = None # 电路创建

# 电路2搭建
circuit2 = None # 电路创建

# 电路运行和数据处理
total_shots = 4096 # 总共重复测量4096次
def deltaP(counts): # 此函数接收{ '1' : XX, '0' : XX }的0/1字典作为输入
	tmp0 = counts['0'] if '0' in counts else 0 # 以防'0'不再counts中
	tmp1 = counts['1'] if '1' in counts else 0 # 以防'1'不再counts中
	print('单次测量结果:\n\t0: %d\n\t1: %d'%(tmp0,tmp1)) # 输出测量结果
	return (tmp0 - tmp1) / (tmp0 + tmp1) # 频率差 = 频数差 / 频数和
job = execute(circuit1, simulator, shots = total_shots) # 执行电路1并将结果存入job
dP_cos = deltaP(job.result().get_counts(circuit1)) # 从job中读取0/1字典通过deltaP函数得到频率差
print('余弦值:', dP_cos) # 输出中间结果
job = execute(circuit2, simulator, shots = total_shots) # 执行电路2并将结果存入job
dP_sin = deltaP(job.result().get_counts(circuit2)) # 从job中读取0/1字典通过deltaP函数得到频率差
print('正弦值:', dP_sin) # 输出中间结果

# 输出结果
print('生成值:', angle) # 输出原有的随机待求值
print('测量值:', atan2(dP_sin,dP_cos)) # 通过atan2函数自动输出规范化并兼容特殊结果的角度测量值